package cn.iocoder.yudao.module.design.service.problemdealerrel;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelCreateReqVO;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelExportReqVO;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelPageReqVO;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelUpdateReqVO;
import cn.iocoder.yudao.module.design.convert.problemdealerrel.ProblemDealerRelConvert;
import cn.iocoder.yudao.module.design.dal.dataobject.problemdealerrel.ProblemDealerRelDO;
import cn.iocoder.yudao.module.design.dal.mysql.problemdealerrel.ProblemDealerRelMapper;
import cn.iocoder.yudao.module.design.enums.design.ProblemRelStatusCdEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;

/**
 * 问题处理人关联 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class ProblemDealerRelServiceImpl implements ProblemDealerRelService {

    @Resource
    private ProblemDealerRelMapper problemDealerRelMapper;

    @Override
    public Long createProblemDealerRel(ProblemDealerRelCreateReqVO createReqVO) {
        // 插入
        ProblemDealerRelDO problemDealerRel = ProblemDealerRelConvert.INSTANCE.convert(createReqVO);
        problemDealerRel.setDeleted(false);
        problemDealerRelMapper.insert(problemDealerRel);
        // 返回
        return problemDealerRel.getId();
    }

    /**
     * 创建问题处理人关联
     *
     * @param userId    处理人
     * @param problemId 问题id
     * @return 编号
     */
    @Override
    public Long createProblemDealerRel(Long userId, Long problemId) {
        // 插入
        ProblemDealerRelDO problemDealerRel = new ProblemDealerRelDO();
        problemDealerRel.setUserId(userId);
        problemDealerRel.setProblemId(problemId);
        problemDealerRel.setStatusCd(ProblemRelStatusCdEnum.PROBLEM_REL_STATUS_CD_ENUM_0.getCode());
        problemDealerRel.setDeleted(false);
        problemDealerRelMapper.insert(problemDealerRel);
        // 返回
        return problemDealerRel.getId();
    }

    @Override
    public void updateProblemDealerRel(ProblemDealerRelUpdateReqVO updateReqVO) {
        // 校验存在
        validateProblemDealerRelExists(updateReqVO.getId());
        // 更新
        ProblemDealerRelDO updateObj = ProblemDealerRelConvert.INSTANCE.convert(updateReqVO);
        problemDealerRelMapper.updateById(updateObj);
    }

    @Override
    public void deleteProblemDealerRel(Long id) {
        // 校验存在
        validateProblemDealerRelExists(id);
        // 删除
        problemDealerRelMapper.deleteById(id);
    }

    /**
     * 删除问题处理人关联
     *
     * @param userId    编号
     * @param problemId
     */
    @Override
    public void deleteProblemDealerRel(Long userId, Long problemId) {
        problemDealerRelMapper.delete(new QueryWrapper<ProblemDealerRelDO>().eq("user_id",userId).eq("problem_id",problemId));
    }

    private void validateProblemDealerRelExists(Long id) {
        if (problemDealerRelMapper.selectById(id) == null) {
//            throw exception(PROBLEM_DEALER_REL_NOT_EXISTS);
        }
    }

    @Override
    public ProblemDealerRelDO getProblemDealerRel(Long id) {
        return problemDealerRelMapper.selectById(id);
    }

    @Override
    public List<ProblemDealerRelDO> getProblemDealerRelList(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return ListUtil.empty();
        }
        return problemDealerRelMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<ProblemDealerRelDO> getProblemDealerRelPage(ProblemDealerRelPageReqVO pageReqVO) {
        return problemDealerRelMapper.selectPage(pageReqVO);
    }

    @Override
    public List<ProblemDealerRelDO> getProblemDealerRelList(ProblemDealerRelExportReqVO exportReqVO) {
        return problemDealerRelMapper.selectList(exportReqVO);
    }

    /**
     * 根据 problemId 查询出所有处理人
     * @param problemId  问题Id
     * @return
     */
    @Override
    public List<ProblemDealerRelDO> getProblemDealerRelListByProblemId(Long problemId) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("problem_id",problemId);
//        queryWrapper.eq("status_cd",ProblemRelStatusCdEnum.PIC_REL_STATUS_CD_ENUM_0.getCode());

        return problemDealerRelMapper.selectList(queryWrapper);
    }

    /**
     * 获得问题处理人关联列表
     * 剔除已关闭 和与我无关
     * @param userId 编号
     * @return 问题处理人关联列表
     */
    @Override
    public List<ProblemDealerRelDO> getProblemDealerRelListByUserId(Long userId) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("user_id",userId);
        queryWrapper.notIn("status_cd",ProblemRelStatusCdEnum.PROBLEM_REL_STATUS_CD_ENUM_5.getCode(),
                ProblemRelStatusCdEnum.PROBLEM_REL_STATUS_CD_ENUM_4.getCode());
        return problemDealerRelMapper.selectList(queryWrapper);
    }


    /**
     * 获得问题处理人关联列表
     *
     * @param problemIds 编号
     * @return 问题处理人关联列表
     */
    @Override
    public List<ProblemDealerRelDO> getProblemDealerRelListByProblemIds(Collection<Long> problemIds) {
        if (CollUtil.isEmpty(problemIds)) {
            return ListUtil.empty();
        }
        QueryWrapper<ProblemDealerRelDO> queryWrapper = new QueryWrapper<ProblemDealerRelDO>();
        queryWrapper.in("problem_id",problemIds);
        queryWrapper.orderByAsc("status_cd");

        return problemDealerRelMapper.selectList(queryWrapper);
    }

    /**
     * @param problemId
     * @param userId
     * @param statusCd
     */
    @Override
    public void updateProblemDealerRelStatus(Long problemId, Long userId, String statusCd) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("problem_id",problemId);
        queryWrapper.eq("user_id",userId);
        ProblemDealerRelDO problemDealerRelDO = new ProblemDealerRelDO();
        problemDealerRelDO.setStatusCd(statusCd);
        problemDealerRelMapper.update(problemDealerRelDO,queryWrapper);
    }

}
